package ooday04;
//多态的演示
public class PolymorphicDemo {
    public static void main(String[] args) {
        //演示向上造型：
        Dog o1 = new Dog("小黑",2,"黑");       //狗是狗
        //o1.name/age/color/drink()/eat()/swim()/lookHome();
        Animal o2 = new Dog("小黑",2,"黑");    //狗是动物--向上造型
        //o2.name/age/color/drink()/eat();
        Swim o3 = new Dog("小黑",2,"黑");      //狗会游泳--向上造型
        //o3.swim();

        //演示向上造型（多态）的第1点应用：
        Master master = new Master();
        //Animal dog = new Dog("小黑",3,"黑");
        Dog dog = new Dog("小黑",3,"黑");
        //Animal chick = new Chick("小花",2,"花");
        Chick chick = new Chick("小花",2,"花");
        //Animal fish = new Fish("小金",1,"金");
        Fish fish = new Fish("小金",1,"金");
        master.feed(dog);   //在传参的同时，系统自动做了向上造型
        master.feed(chick); //Animal animal = dog;
        master.feed(fish);
        System.out.println("---------------------------------");
        //演示向上造型（多态）的第2点应用：
        //Animal o = new Animal();  //编译错误，抽象类不能被实例化
         Animal[] animals = new Animal[5];
         animals[0] = new Dog("小黑",4,"黑");  //向上造型
         animals[1] = new Dog("小白",5,"白");
         animals[2] = new Fish("小金",1,"金");
         animals[3] = new Fish("小蓝",2,"蓝");
         animals[4] = new Chick("小灰",3,"灰");
         for (int i=0;i<animals.length;i++){        //遍历所有动物
             System.out.println(animals[i].name);   //输出每个动物的名字
             animals[i].eat();                      //每个动物吃饭
             animals[i].drink();                    //每个动物喝水
             if (animals[i] instanceof Dog){
                 Dog dog1 = (Dog) animals[i];
                 dog1.lookHome();
             }
             if (animals[i] instanceof Chick){
                 Chick chick1 = (Chick) animals[i];
                 chick1.layEggs();
             }
             if (animals[i] instanceof Swim){   //适用于所有实现Swim接口的（会游泳的）
                 Swim s = (Swim) animals[i];
                 s.swim();
             }
         }
        System.out.println("---------------------------------");
        //演示强转成功的条件：
        Animal o = new Dog("小黑",4,"黑");
        Dog g = (Dog) o;    //引用o所指向的对象，就是Dog类型
        Swim s = (Swim) o;  //引用o所指向的对象，实现了Swim接口
        //Fish f = (Fish) o;//运行时会发生ClassCastException类型转换异常
        System.out.println(o instanceof Dog);   //true
        System.out.println(o instanceof Swim);  //true
        System.out.println(o instanceof Fish);  //false
        if (o instanceof Fish){                 //false
            Fish f = (Fish) o;
        }
        System.out.println("---------------------------------");
    }
}
